#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "numeros.h"
#include "backend-privado.h"
#include "backend-publico.h"
#include "../ep1.h"

/* Neste vetor global serão guardados os valores dos numeros */
numero numeros[QTDE_NUMEROS];

void seta_seletor_valor (GtkButton *widget, gpointer p_num)
{
	numero *num = (numero*) p_num;
	int valor;

	if (num->fixo==TRUE)
		return;

	valor = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(widget), "valor"));
	setaNumero(num->posicao.linha, num->posicao.coluna, valor);

	gtk_widget_destroy(gtk_widget_get_toplevel(GTK_WIDGET(widget)));

	msgVitoria();
}

/* Mostra a janela onde pode-se escolher um novo valor */
gboolean mostra_seletor_valor(GtkWidget *widget,  GdkEventButton *event, gpointer p_num)
{
	gchar texto[2];
	GtkWidget *w;
	GtkWidget *table;
	GtkWidget *novoBotao;
	int i;
	numero *num = (numero*) p_num;

	/* Se for fixo, sai.*/
	if (num->fixo == TRUE)
		return TRUE;

	/* Criamos a janela de opções */
	w = gtk_window_new(GTK_WINDOW_POPUP);
	table = gtk_table_new(4,3,TRUE);
	gtk_container_set_border_width(GTK_CONTAINER(table),2);
	/* Montamos a lista de opções, sempre chamando verificaSePodeColocarNumero */
	for(i=1; i<=9; i++)
	{
			texto[0]='0'+i; texto[1]='\0';
			novoBotao=gtk_button_new_with_label(texto);
			g_object_set_data(G_OBJECT(novoBotao), "valor", GINT_TO_POINTER(i));

			if (verificaSePodeColocarNumero(i, num->posicao.linha, num->posicao.coluna))
				g_signal_connect(G_OBJECT(novoBotao), "clicked", G_CALLBACK( seta_seletor_valor ), p_num);
			else
				gtk_widget_set_sensitive(novoBotao, FALSE);

			gtk_table_attach_defaults(GTK_TABLE(table), novoBotao, ((i-1)%3), ((i-1)%3)+1, ((i-1)/3), ((i-1)/3)+1);
	}
	novoBotao=gtk_button_new_with_label("Limpa");
	g_object_set_data(G_OBJECT(novoBotao), "valor", GINT_TO_POINTER(0));
	g_signal_connect(G_OBJECT(novoBotao), "clicked", G_CALLBACK( seta_seletor_valor ), p_num);
	gtk_table_attach_defaults(GTK_TABLE(table), novoBotao, 0, 3, 3, 4);

	gtk_container_add(GTK_CONTAINER(w), table);
	gtk_window_set_position(GTK_WINDOW(w), GTK_WIN_POS_MOUSE);

	gtk_widget_show_all(w);

	return TRUE;
}

/* Inicializa as casa de números */
void numeros_inicializa_widgets()
{
	GdkColor branco;
	int pos;

	for (pos=0; pos<QTDE_NUMEROS; pos++)
	{
		/* Cria a EventBox */
		numeros[pos].eventBox = gtk_event_box_new();

		/* Cria o Label */
		numeros[pos].label = gtk_label_new(NULL);
		gtk_container_add(GTK_CONTAINER(numeros[pos].eventBox), numeros[pos].label);

		/* Seta cor do fundo */
		gdk_color_parse("white", &branco);
		gtk_widget_modify_bg(numeros[pos].eventBox, GTK_STATE_NORMAL, &branco);
		gtk_widget_modify_base(numeros[pos].eventBox, GTK_STATE_NORMAL, &branco);
		gtk_widget_modify_fg(numeros[pos].eventBox, GTK_STATE_NORMAL, &branco);

		if (! numeros[pos].fixo)
		{
			/* Conecta eventos */
			g_signal_connect(G_OBJECT(numeros[pos].eventBox), "button_press_event",
					G_CALLBACK( mostra_seletor_valor ), &(numeros[pos]));
		}
	}
}

/* Redesenha o valor no label */
void numeros_repinta(unsigned int linha, unsigned int coluna)
{
	gchar texto[45];
	int pos=(linha-1)*9 + coluna -1;

	g_assert(linha >= 1 && linha <= 9);
	g_assert(coluna >= 1 && coluna <= 9);

	if (numeros[pos].valor == 0)
		gtk_label_set_label(GTK_LABEL(numeros[pos].label), "");
	else {
		if (numeros[pos].fixo)
			g_snprintf(texto, 44, "<b><span font_size='xx-large'>%d</span></b>",numeros[pos].valor);
		else
			g_snprintf(texto, 37, "<span font_size='xx-large'>%d</span>", numeros[pos].valor);
		gtk_label_set_markup(GTK_LABEL(numeros[pos].label), texto);
	}
}
